/** Request 网络请求工具 更详细的 api 文档: https://github.com/umijs/umi-request */
import { extend } from 'umi-request'
import { history } from 'umi'
import { message } from 'antd'
import { refreshToken } from '@/services/user'

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '处理数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
}
/** 异常处理程序 */

const errorHandler = async (error) => {
  const { response } = error
  const result = await response.json()

  if (response && response.status) {

    let errorText = codeMessage[response.status] || response.statusText
    const { status } = response

    // 错误码的处理
    if (status === 422) {
      errorText = ''
      for (const key in result.errors) {
        errorText += result.errors[key][0]
      }
    }

    if (status === 500) {
      errorText = result.message
    }

    // 处理401 token
    if (status === 401 && result.message === 'Token has expired') {
      const token = await refreshToken()
      localStorage.setItem('access_token', token.access_token)

      return retry(response)
    } else if ((status === 401) && (result.message !== 'Token has expired')){
      localStorage.clear()
      errorText = `[${result.message}]`
      history.replace('/login')
    }


    // 处理404错误码
    if (status === 404) {
      errorText = result.message
    }
    // 处理429错误码
    if (status === 429) {
      errorText = result.message
    }

    // 处理502错误码
    if (status === 502) {
      errorText = result.message
    }
    // 处理400错误码
    if (status === 400) {
      errorText = result.message
    }
    message.error(errorText)
  } else if (!response) {
    message.error('网络异常，无法连接至服务器')
  }
  return result
}
/** 配置request请求时的默认参数 */

const request = extend({
  errorHandler,
  // 默认错误处理
  credentials: 'include', // 默认请求是否带上cookie
  prefix: '/api',
  timeout: 0,
  ttl: 0,
})

/**
 * 请求拦截器,在请求之前添加header头
 */
request.interceptors.request.use((url, options) => {
  // 请求中不包含// ==-1
  const urlState = url.indexOf('//') == -1 ? true : false
  const baseurl = urlState ? ('http://exam.hks.cool' + url) : url

  const timeout = 1000000

  // 设置token
  const token = localStorage.getItem('access_token') || ''

  const headers = {
    Authorization: `Bearer ${token}`
  }

  return {
    url: baseurl,
    options: { ...options, interceptors: true, headers, timeout },
  }
}, { global: true })

/**
 * 重新请求
 * @param response
 * @returns {Promise<RequestResponse<any>>}
 */
const retry = async (response) => {
  let url = response.url.split('/api')[1]
  return await request(url)
}

export default request
